package core;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.util.Set;

import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class HibernateUtil {

	public static final SessionFactory sessionFactory;

	static {
		try {
			// Create the SessionFactory from hibernate.cfg.xml
			sessionFactory = new Configuration().configure()
					.buildSessionFactory();
		} catch (Throwable ex) {
			// Make sure you log the exception, as it might be swallowed
			System.err.println("Initial SessionFactory creation failed." + ex);
			throw new ExceptionInInitializerError(ex);
		}
	}

	public static final ThreadLocal session = new ThreadLocal();

	public static Session currentSession() throws HibernateException {
		Session s = (Session) session.get();
		// Open a new Session, if this thread has none yet
		if (s == null) {
			s = sessionFactory.openSession();
			// Store it in the ThreadLocal variable
			session.set(s);
		}
		return s;
	}

	public static void closeSession() throws HibernateException {
		Session s = (Session) session.get();
		if (s != null)
			s.close();
		session.set(null);
	}

	static Connection conn;
	static Statement st;

	public static void setup(String sql) {
		try {
			// Step 1: Load the JDBC driver.
			Class.forName("org.hsqldb.jdbcDriver");
			// System.out.println("Driver Loaded.");
			// Step 2: Establish the connection to the database.
			String url = "jdbc:hsqldb:data/tutorial";
			conn = DriverManager.getConnection(url, "sa", "");
			// System.out.println("Got Connection.");

			st = conn.createStatement();
			st.executeUpdate(sql);
		} catch (Exception e) {
			System.err.println("Table loaded.");
//			e.printStackTrace();
//			System.exit(0);
		}
	}
        public static ResultSet getResultSet(String sql) throws Exception {
            ResultSet rs = st.executeQuery(sql);





//            ResultSetMetaData metadata = rs.getMetaData();
//            int numcols = metadata.getColumnCount();
//		String[] labels = new String[numcols];
//		int[] colwidths = new int[numcols];
//		int[] colpos = new int[numcols];
//		int linewidth;
//
//		for (int i = 0; i < numcols; i++) {
//			labels[i] = metadata.getColumnLabel(i + 1); // get its label
//			System.out.print(labels[i] + "  ");
//		}
//		System.out.println("------------------------");
//
//		while (rs.next()) {
//			for (int i = 0; i < numcols; i++) {
//				Object value = rs.getObject(i + 1);
//				if (value == null) {
//					System.out.print("       ");
//				} else {
//					System.out.print(value.toString().trim() + "   ");
//				}
//
//			}
//			System.out.println("       ");
//		}

       return rs;

	}
	public static void checkData(String sql) {
		try {
			HibernateUtil.outputResultSet(st.executeQuery(sql));
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void outputResultSet(ResultSet rs) throws Exception {
		ResultSetMetaData metadata = rs.getMetaData();

		int numcols = metadata.getColumnCount();
		String[] labels = new String[numcols];
		int[] colwidths = new int[numcols];
		int[] colpos = new int[numcols];
		int linewidth;

		for (int i = 0; i < numcols; i++) {
			labels[i] = metadata.getColumnLabel(i + 1); // get its label
			System.out.print(labels[i] + "  ");
		}
		System.out.println("------------------------");

		while (rs.next()) {
			for (int i = 0; i < numcols; i++) {
				Object value = rs.getObject(i + 1);
				if (value == null) {
					System.out.print("       ");
				} else {
					System.out.print(value.toString().trim() + "   ");
				}

			}
			System.out.println("       ");
		}
	}
}